/*******************************************************************************
 * javascript for check html at frontground
 *
 * @Chujue_Validator    : 用于合法性检查的函数
 *
 * version : v0.1
 *           v0.2   validation分组的功能，通过控件 的class来分组
 *           v0.3   添加手机号，email验证
 * base on : jquery 1.10.2
 *           bootstrap v3
 ******************************************************************************/

// normal check
var MSG_0001 = "请输入 [$0]";
var MSG_0002 = "[$0] 的长度不能大于 [$1]";
var MSG_0003 = "[$0] 的长度不能小于 [$1]";
var MSG_0004 = "[$0] 的长度必须介于 [$1] 和 [$2] 之间";

// regexp check
var MSG_0101 = "[$0] 必须是数字";
var MSG_0102 = "[$0] 不符合IP地址格式";
var MSG_0103 = "[$0] 不符合email格式";
var MSG_0104 = "[$0] 不符合手机号码格式";

// replace 
var format_msg = function(msg, msg_params) {
    // console.log(msg);
    for (var i = 0; i < msg_params.length; i++) {
        msg = msg.replace("$" + i.toString(), msg_params[i]); 
    }

    return msg;
};


/*
 * cj-validator format:
 */
function Chujue_Validator()
{
    var validator_props = ['cj-name','cj-display'];
    // cj-place = 'top', 'bottom', 'left', 'right'

    var validator_add_popover = function(control, content) {
        $(control).attr("data-container", "body");
        // $(control).attr("data-toggle", "popover");
        $(control).attr("data-placement", $(control).attr("cj-place"));
        $(control).attr("data-content", content);
        $(control).attr("style", "border-color:red");
        $(control).popover("show");
        // alert($(control).attr('cj-place'));
    };

    var validator_remove_popover = function(control) {
        $(control).removeAttr("data-container");
        $(control).removeAttr("data-placement");
        $(control).removeAttr("data-content");
        $(control).removeAttr("style");
        $(control).popover("destroy");
        // alert($(control).attr('cj-place'));
    };

    var check_required = function(control){
        // alert('required');
        // alert($(control).val());
        if ($(control).val() == "") {
            // alert($(control).attr("cj-name"));
            var content = format_msg(MSG_0001, [$(control).attr('cj-name')]);
            validator_add_popover(control, content);
            return false;
        }
        else
            validator_remove_popover(control);

        return true;
    };

    var check_maxlen = function(control, max) {
        if ($(control).val().length > parseInt(max)) {
            var content = format_msg(MSG_0002, [$(control).attr("cj-name"),
                                                max]);
            validator_add_popover(control, content);
            return false;
        }
        else
            validator_remove_popover(control);
        return true;
    };

    var check_minlen = function(control, min) {
        if ($(control).val().length < parseInt(min)) {
            var content = format_msg(MSG_0003, [$(control).attr("cj-name"),
                                                min]);
            validator_add_popover(control, content);
            return false;
        }
        else
            validator_remove_popover(control);
        return true;
    };
    
    var check_range = function(control, range) {
        range = eval(range);
        if (check_maxlen(control, range[1]) && check_minlen(control, range[0]))
            validator_remove_popover(control);
        else {
            var content = format_msg(MSG_0004, [$(control).attr("cj-name"),
                                                range[0], range[1]]);
            validator_add_popover(control, content);
            return false;            
        }
        return true;
    };

    var check_reg = function(control, reg, msg) {
        if ($(control).val().match(reg))
            validator_remove_popover(control);
        else {
            validator_add_popover(control, msg);
            return false;
        }
        return true;
    };

    var check_digit = function(control) {
        var content = format_msg(MSG_0101, [$(control).attr("cj-name")]);
        var d_reg = /\d+/;
        return check_reg(control, d_reg, content);
    };

    var check_ip = function(control) {
        var content = format_msg(MSG_0102, [$(control).attr("cj-name")]);
        var ip_reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/;
        return check_reg(control, ip_reg, content);
    };

    var check_email = function(control){
        var content = format_msg(MSG_0103,[$(control).attr("cj-name")]);
        var email_reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
        return check_reg(control, email_reg, content);
    }

    var check_telephone=function(control){
        var content=format_msg(MSG_0104,[$(control).attr("cj-name")]);
        var telephone_reg=/^0?(13[0-9]|15[012356789]|18[0236789]|14[57])[0-9]{8}$/;
        return check_reg(control, telephone_reg, content);
    }

    var validator_rules = {'cj-required'  :  check_required,
                           'cj-maxlen'    :  check_maxlen,
                           'cj-minlen'    :  check_minlen,
                           'cj-range'     :  check_range,
                           'cj-digit'     :  check_digit,
                           'cj-ip'        :  check_ip,
                           'cj-email'     :  check_email,
                           'cj-telephone' :  check_telephone,
                           'cj-reg'       :  check_reg };
    
    this.validation = function(validate_group){
        var cj_vals = $(validate_group);
        var check_result = true;

        for (var i=0; i < cj_vals.length; i++){
           //  alert($(cj_vals[i]).attr('cj-required'));
            for (var key in validator_rules) {
                // check if has attr key or not
                if ($(cj_vals[i]).attr(key) != undefined)
                    // do the validation check
                    if (!validator_rules[key].apply(this, [$(cj_vals[i]),
                                                           $(cj_vals[i]).attr(key)])) {
                        check_result = false;
                        break;
                    }
            }
        }
        return check_result;
    };

    this.clear_validation = function(validate_group) {
        var cj_vals = $(validate_group);
        for (var i=0; i < cj_vals.length; i++){
            validator_remove_popover(cj_vals[i]);
        }
    };
}
